package com.xie.leetcode.characterstring;

//整数反转
//        给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
//
//        如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
//
//        假设环境不允许存储 64 位整数（有符号或无符号）。
//         
//
//        示例 1：
//
//        输入：x = 123
//        输出：321
//        示例 2：
//
//        输入：x = -123
//        输出：-321
//        示例 3：
//
//        输入：x = 120
//        输出：21
//        示例 4：
//
//        输入：x = 0
//        输出：0
//         
//
//        提示：
//
//        -231 <= x <= 231 - 1
//        相关标签
//        数学
//
//        作者：力扣 (LeetCode)
//        链接：https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/
//        来源：力扣（LeetCode）
//        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

import java.math.BigDecimal;

/**
 * @author xiezhendong
 * @date 2021/10/22
 */
public class Reverse {

    public static void main(String[] args) {
        Reverse reverse = new Reverse();
        System.out.println(reverse.reverse(123));
        System.out.println(reverse.reverse(-123));
        System.out.println(reverse.reverse(120));
        System.out.println(reverse.reverse(0));
    }

    public int reverse(int x) {
        boolean negativeFlag = (x < 0);
        if (negativeFlag) {
            x = x * -1;
        }
        int len = String.valueOf(x).length();
        int[] xs = new int[len];

        BigDecimal num = BigDecimal.valueOf(x);
        for (int i = 0; i < len; i++) {
            int weishu = len - i;
            BigDecimal num10 = BigDecimal.ONE;
            for (int i1 = 1; i1 < weishu; i1++) {
                num10 = num10.multiply(BigDecimal.TEN);
            }
            BigDecimal valueLast = BigDecimal.valueOf(num.divide(num10.multiply(BigDecimal.TEN)).intValue()).multiply(BigDecimal.TEN);
            BigDecimal value = BigDecimal.valueOf(num.divide(num10).intValue()).subtract(BigDecimal.valueOf(valueLast.intValue()));
            xs[i] = value.intValue();
        }
        for (int i = 0; i < xs.length / 2; i++) {
            int temp = xs[i];
            xs[i] = xs[xs.length - 1 - i];
            xs[xs.length - 1 - i] = temp;
        }
        BigDecimal numNew = BigDecimal.ZERO;
        for (int i = 0; i < xs.length; i++) {
            int weishu = xs.length - i;
            BigDecimal num10 = BigDecimal.ONE;
            for (int i1 = 1; i1 < weishu; i1++) {
                num10 = num10.multiply(BigDecimal.TEN);
            }
            BigDecimal value = num10.multiply(BigDecimal.valueOf(xs[i]));
            numNew = value.add(numNew);
        }
        if (negativeFlag) {
            numNew = numNew.multiply(BigDecimal.valueOf(-1));
        }
        if (numNew.longValue() > Integer.MAX_VALUE || numNew.longValue() < Integer.MIN_VALUE) {
            return 0;
        }
        return numNew.intValue();
    }
}
